package com.outdoor.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.outdoor.model.dto.request.TeamCreateRequest;
import com.outdoor.model.entity.Team;
import com.outdoor.model.enums.ActivityType;
import java.time.LocalDate;
import java.util.List;

/**
 * 团队服务接口
 * 
 * @author OutdoorTeam
 * @date 2025-05-18
 */
public interface TeamService {

    /**
     * 创建团队
     * 
     * @param request 团队创建请求
     * @param leaderId 领队ID
     * @return 创建的团队
     */
    Team createTeam(TeamCreateRequest request, Long leaderId);

    /**
     * 获取团队详情
     * 
     * @param id 团队ID
     * @return 团队信息
     */
    Team getTeamById(Long id);

    /**
     * 更新团队信息
     * 
     * @param id 团队ID
     * @param request 团队更新请求
     * @param currentUserId 当前操作用户ID
     * @return 更新后的团队
     */
    Team updateTeam(Long id, TeamCreateRequest request, Long currentUserId);

    /**
     * 删除团队
     * 
     * @param id 团队ID
     * @param currentUserId 当前操作用户ID
     */
    void deleteTeam(Long id, Long currentUserId);

    /**
     * 查询用户创建的团队
     * 
     * @param userId 用户ID
     * @param page 分页对象
     * @return 团队分页列表
     */
    IPage<Team> getTeamsByLeader(Long userId, Page<Team> page);

    /**
     * 查询用户参与的团队
     * 
     * @param userId 用户ID
     * @param page 分页对象
     * @return 团队分页列表
     */
    IPage<Team> getTeamsByMember(Long userId, Page<Team> page);

    /**
     * 按条件筛选团队
     * 
     * @param activityType 活动类型
     * @param location 活动地点
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param keyword 关键词，用于模糊搜索团队名称和地点
     * @param page 分页对象
     * @return 团队分页列表
     */
    IPage<Team> findTeams(ActivityType activityType, String location, LocalDate startDate, LocalDate endDate, String keyword, Page<Team> page);

    /**
     * 用户加入团队
     * 
     * @param teamId 团队ID
     * @param userId 用户ID
     * @return 更新后的团队
     */
    Team joinTeam(Long teamId, Long userId);

    /**
     * 用户退出团队
     * 
     * @param teamId 团队ID
     * @param userId 用户ID
     * @return 更新后的团队
     */
    Team leaveTeam(Long teamId, Long userId);

    /**
     * 获取团队成员ID列表
     * 
     * @param teamId 团队ID
     * @return 成员ID列表
     */
    List<Long> getTeamMemberIds(Long teamId);

    /**
     * 更新团队关联行程
     * @param team
     */
    public void updateTeamTrip(Team team);
    
    /**
     * 获取用户管理的团队ID列表
     * 
     * @param userId 用户ID
     * @return 管理的团队ID列表
     */
    List<Long> getTeamIdsByLeader(Long userId);
} 